package com.hospital.controller;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * websocket 服务类，提供聊天服务，是数据交换中心
 */

@ServerEndpoint("/websocket/{pageCode}")
@Component
public class WebSocketServer {
    public static Map<String, Set<Session>> electricSocketMap = new ConcurrentHashMap<>();

    /**
     * @Description: 建立连接成功的方法
     */
    @OnOpen
    public void onOpen(@PathParam("pageCode") String pageCode, Session session) { //用@PathParam获取参数的值
        Set<Session> sessions = electricSocketMap.get(pageCode);
        if (null == sessions) {
            Set<Session> sessionList = new HashSet<>(); //往这个sessionList中保存一个session，一个session对应一个客户端
            sessionList.add(session);
            electricSocketMap.put(pageCode, sessionList);
        } else {
            if (!sessions.contains(session)) {
                sessions.add(session);
            }
        }
    }

    /**
     * @Description: 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("pageCode") String pageCode, Session session) {
        if (electricSocketMap.containsKey(pageCode)) {
            electricSocketMap.get(pageCode).remove(session);
        }
    }

    /**
     * @Description: 收到客户端消息后调用的方法
     */
    @OnMessage
    public void onMessage(String pageCode, Session httpSession) {
        try {
            String[] split = pageCode.split(",");
            Set<Session> sessions = electricSocketMap.get(split[0]);
            for (Session session : sessions) {
                if (session != null && !session.equals(httpSession)) {
                    session.getBasicRemote().sendText(split[1]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description: 发生错误时调用
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误");
    }
}
